home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / parser.jar / com / sun / xml / parser / XmlReader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-02-23  |  5.5 KB  |  286 lines

  1. package com.sun.xml.parser;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.FilterInputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.io.PushbackInputStream;
  9. import java.io.Reader;
  10. import java.util.Hashtable;
  11.  
  12. final class XmlReader extends Reader {
  13.    private static final int MAXPUSHBACK = 512;
  14.    // $FF: renamed from: in java.io.Reader
  15.    private Reader field_0;
  16.    private String assignedEncoding;
  17.    private boolean closed;
  18.    private static final Hashtable charsets = new Hashtable(31);
  19.  
  20.    static {
  21.       charsets.put("UTF-16", "Unicode");
  22.       charsets.put("ISO-10646-UCS-2", "Unicode");
  23.       charsets.put("EBCDIC-CP-US", "cp037");
  24.       charsets.put("EBCDIC-CP-CA", "cp037");
  25.       charsets.put("EBCDIC-CP-NL", "cp037");
  26.       charsets.put("EBCDIC-CP-WT", "cp037");
  27.       charsets.put("EBCDIC-CP-DK", "cp277");
  28.       charsets.put("EBCDIC-CP-NO", "cp277");
  29.       charsets.put("EBCDIC-CP-FI", "cp278");
  30.       charsets.put("EBCDIC-CP-SE", "cp278");
  31.       charsets.put("EBCDIC-CP-IT", "cp280");
  32.       charsets.put("EBCDIC-CP-ES", "cp284");
  33.       charsets.put("EBCDIC-CP-GB", "cp285");
  34.       charsets.put("EBCDIC-CP-FR", "cp297");
  35.       charsets.put("EBCDIC-CP-AR1", "cp420");
  36.       charsets.put("EBCDIC-CP-HE", "cp424");
  37.       charsets.put("EBCDIC-CP-BE", "cp500");
  38.       charsets.put("EBCDIC-CP-CH", "cp500");
  39.       charsets.put("EBCDIC-CP-ROECE", "cp870");
  40.       charsets.put("EBCDIC-CP-YU", "cp870");
  41.       charsets.put("EBCDIC-CP-IS", "cp871");
  42.       charsets.put("EBCDIC-CP-AR2", "cp918");
  43.    }
  44.  
  45.    private XmlReader(InputStream var1) throws IOException {
  46.       super(var1);
  47.       PushbackInputStream var2 = new PushbackInputStream(var1, 512);
  48.       byte[] var3 = new byte[4];
  49.       int var4 = ((FilterInputStream)var2).read(var3);
  50.       if (var4 > 0) {
  51.          var2.unread(var3, 0, var4);
  52.       }
  53.  
  54.       if (var4 == 4) {
  55.          label44:
  56.          switch (var3[0] & 255) {
  57.             case 0:
  58.                if (var3[1] == 60 && var3[2] == 0 && var3[3] == 63) {
  59.                   this.setEncoding(var2, "UnicodeBig");
  60.                   return;
  61.                }
  62.                break;
  63.             case 60:
  64.                switch (var3[1] & 255) {
  65.                   case 0:
  66.                      if (var3[2] == 63 && var3[3] == 0) {
  67.                         this.setEncoding(var2, "UnicodeLittle");
  68.                         return;
  69.                      }
  70.                      break label44;
  71.                   case 63:
  72.                      if (var3[2] == 120 && var3[3] == 109) {
  73.                         this.useEncodingDecl(var2, "UTF8");
  74.                         return;
  75.                      }
  76.                   default:
  77.                      break label44;
  78.                }
  79.             case 76:
  80.                if (var3[1] == 111 && (255 & var3[2]) == 167 && (255 & var3[3]) == 148) {
  81.                   this.useEncodingDecl(var2, "CP037");
  82.                   return;
  83.                }
  84.                break;
  85.             case 254:
  86.                if ((var3[1] & 255) == 255) {
  87.                   this.setEncoding(var2, "UTF-16");
  88.                   return;
  89.                }
  90.                break;
  91.             case 255:
  92.                if ((var3[1] & 255) == 254) {
  93.                   this.setEncoding(var2, "UTF-16");
  94.                   return;
  95.                }
  96.          }
  97.       }
  98.  
  99.       this.setEncoding(var2, "UTF-8");
  100.    }
  101.  
  102.    public void close() throws IOException {
  103.       if (!this.closed) {
  104.          this.field_0.close();
  105.          this.field_0 = null;
  106.          this.closed = true;
  107.       }
  108.    }
  109.  
  110.    public static Reader createReader(InputStream var0) throws IOException {
  111.       return new XmlReader(var0);
  112.    }
  113.  
  114.    public static Reader createReader(InputStream var0, String var1) throws IOException {
  115.       if (var1 == null) {
  116.          return new XmlReader(var0);
  117.       } else if (!"UTF-8".equalsIgnoreCase(var1) && !"UTF8".equalsIgnoreCase(var1)) {
  118.          if (!"US-ASCII".equalsIgnoreCase(var1) && !"ASCII".equalsIgnoreCase(var1)) {
  119.             return (Reader)("ISO-8859-1".equalsIgnoreCase(var1) ? new Iso8859_1Reader(var0) : new InputStreamReader(var0, std2java(var1)));
  120.          } else {
  121.             return new AsciiReader(var0);
  122.          }
  123.       } else {
  124.          return new Utf8Reader(var0);
  125.       }
  126.    }
  127.  
  128.    public String getEncoding() {
  129.       return this.assignedEncoding;
  130.    }
  131.  
  132.    public void mark(int var1) throws IOException {
  133.       if (this.field_0 != null) {
  134.          this.field_0.mark(var1);
  135.       }
  136.  
  137.    }
  138.  
  139.    public boolean markSupported() {
  140.       return this.field_0 == null ? false : this.field_0.markSupported();
  141.    }
  142.  
  143.    public int read() throws IOException {
  144.       if (this.closed) {
  145.          throw new IOException("closed");
  146.       } else {
  147.          int var1 = this.field_0.read();
  148.          if (var1 == -1) {
  149.             this.close();
  150.          }
  151.  
  152.          return var1;
  153.       }
  154.    }
  155.  
  156.    public int read(char[] var1, int var2, int var3) throws IOException {
  157.       if (this.closed) {
  158.          return -1;
  159.       } else {
  160.          int var4 = this.field_0.read(var1, var2, var3);
  161.          if (var4 == -1) {
  162.             this.close();
  163.          }
  164.  
  165.          return var4;
  166.       }
  167.    }
  168.  
  169.    public boolean ready() throws IOException {
  170.       return this.field_0 == null ? false : this.field_0.ready();
  171.    }
  172.  
  173.    public void reset() throws IOException {
  174.       if (this.field_0 != null) {
  175.          this.field_0.reset();
  176.       }
  177.  
  178.    }
  179.  
  180.    private void setEncoding(InputStream var1, String var2) throws IOException {
  181.       this.assignedEncoding = var2;
  182.       this.field_0 = createReader(var1, var2);
  183.    }
  184.  
  185.    public long skip(long var1) throws IOException {
  186.       return this.field_0 == null ? 0L : this.field_0.skip(var1);
  187.    }
  188.  
  189.    private static String std2java(String var0) {
  190.       String var1 = var0.toUpperCase();
  191.       var1 = (String)charsets.get(var1);
  192.       return var1 != null ? var1 : var0;
  193.    }
  194.  
  195.    private void useEncodingDecl(PushbackInputStream var1, String var2) throws IOException {
  196.       byte[] var3 = new byte[512];
  197.       int var4 = var1.read(var3, 0, var3.length);
  198.       var1.unread(var3, 0, var4);
  199.       InputStreamReader var5 = new InputStreamReader(new ByteArrayInputStream(var3, 4, var4), var2);
  200.       if (((Reader)var5).read() != 108) {
  201.          this.setEncoding(var1, "UTF-8");
  202.       } else {
  203.          StringBuffer var7 = new StringBuffer();
  204.          StringBuffer var8 = null;
  205.          String var9 = null;
  206.          boolean var10 = false;
  207.          char var11 = 0;
  208.          boolean var12 = false;
  209.  
  210.          int var6;
  211.          label127:
  212.          for(int var13 = 0; var13 < 507 && (var6 = ((Reader)var5).read()) != -1; ++var13) {
  213.             if (var6 != 32 && var6 != 9 && var6 != 10 && var6 != 13) {
  214.                if (var13 == 0) {
  215.                   break;
  216.                }
  217.  
  218.                if (var6 == 63) {
  219.                   var12 = true;
  220.                } else if (var12) {
  221.                   if (var6 == 62) {
  222.                      break;
  223.                   }
  224.  
  225.                   var12 = false;
  226.                }
  227.  
  228.                if (var9 != null && var10) {
  229.                   if (!Character.isWhitespace((char)var6)) {
  230.                      if (var6 == 34 || var6 == 39) {
  231.                         if (var11 == 0) {
  232.                            var11 = (char)var6;
  233.                            var7.setLength(0);
  234.                            continue;
  235.                         }
  236.  
  237.                         if (var6 == var11) {
  238.                            if ("encoding".equals(var9)) {
  239.                               this.assignedEncoding = var7.toString();
  240.  
  241.                               for(int var15 = 0; var15 < this.assignedEncoding.length(); ++var15) {
  242.                                  var6 = this.assignedEncoding.charAt(var15);
  243.                                  if ((var6 < 65 || var6 > 90) && (var6 < 97 || var6 > 122) && (var15 == 0 || var15 <= 0 || var6 != 45 && (var6 < 48 || var6 > 57) && var6 != 46 && var6 != 95)) {
  244.                                     break label127;
  245.                                  }
  246.                               }
  247.  
  248.                               this.setEncoding(var1, this.assignedEncoding);
  249.                               return;
  250.                            }
  251.  
  252.                            var9 = null;
  253.                            continue;
  254.                         }
  255.                      }
  256.  
  257.                      var7.append((char)var6);
  258.                   }
  259.                } else if (var8 == null) {
  260.                   if (!Character.isWhitespace((char)var6)) {
  261.                      var8 = var7;
  262.                      var7.setLength(0);
  263.                      var7.append((char)var6);
  264.                      var10 = false;
  265.                   }
  266.                } else if (Character.isWhitespace((char)var6)) {
  267.                   var9 = var8.toString();
  268.                } else if (var6 == 61) {
  269.                   if (var9 == null) {
  270.                      var9 = var8.toString();
  271.                   }
  272.  
  273.                   var10 = true;
  274.                   var8 = null;
  275.                   var11 = 0;
  276.                } else {
  277.                   var8.append((char)var6);
  278.                }
  279.             }
  280.          }
  281.  
  282.          this.setEncoding(var1, "UTF-8");
  283.       }
  284.    }
  285. }
  286.